﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace GIC.UI.Helper
{
    class ArquivoHelper
    {
        private String message;
        public bool arquivandoChave(String psChave)
        {

           string nomeArquivo = "bin.txt";
           string arquivoRenomeado = "bin.exe";
           string dataHoje = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")).ToString();
           String sDataInicio = psChave.Substring(6, 2).ToString() + "/" + psChave.Substring(4, 2).ToString() + "/" + psChave.Substring(0, 4).ToString();
           DateTime dataInicio = Convert.ToDateTime(sDataInicio);
           String sDataFim = psChave.Substring(14, 2).ToString() + "/" + psChave.Substring(12, 2).ToString() + "/" + psChave.Substring(8, 4).ToString();
           DateTime dataFim = Convert.ToDateTime(sDataFim);
           if (verificarNotificacao(dataInicio, dataFim))
               return true;

           if (!File.Exists(arquivoRenomeado))
           {
                using (FileStream fs = File.Create(nomeArquivo)){
                    using (StreamWriter sw = new StreamWriter(fs))
                    {
                        sw.Write(psChave + " " + dataHoje);
                    }
                }
                File.Move(nomeArquivo, arquivoRenomeado);
                return false;
           }

           File.Move(arquivoRenomeado, nomeArquivo);

           FileInfo aFile = new FileInfo(nomeArquivo);
           StreamReader rd = new StreamReader(aFile.FullName);
           DateTime ultimoRegistro = new DateTime();
           string data = null;
           while (!rd.EndOfStream)
           {
                  data = rd.ReadLine();
                  ultimoRegistro = Convert.ToDateTime(data.Substring(17));
                  dataInicio = Convert.ToDateTime(sDataInicio);
           }
           rd.Close();

           if (dataAtualEhMenor(ultimoRegistro, DateTime.Now))
           {
               File.Move(nomeArquivo, arquivoRenomeado);
               return true;
           }

           if (verificarDia(ultimoRegistro, DateTime.Now))
           {
               File.Move(nomeArquivo, arquivoRenomeado);
               return false;
           }

           StreamWriter wr = new StreamWriter(aFile.FullName, true);
           wr.Write(Environment.NewLine + psChave + " " + dataHoje);
            wr.Close();

           File.Move(nomeArquivo, arquivoRenomeado);
           return false;

        }

        public String chaveCriptografada(String sChave) {
            string dataInicio = null;
            string dataFim = null;

            if (sChave.Length != 33)
                return null;

            dataInicio += Convert.ToInt16(sChave.Substring(1, 2)) / Convert.ToInt16(sChave.Substring(0, 1));
            dataInicio += Convert.ToInt16(sChave.Substring(3, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataInicio += Convert.ToInt16(sChave.Substring(5, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataInicio += Convert.ToInt16(sChave.Substring(7, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataInicio += Convert.ToInt16(sChave.Substring(9, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataInicio += Convert.ToInt16(sChave.Substring(11, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataInicio += Convert.ToInt16(sChave.Substring(13, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataInicio += Convert.ToInt16(sChave.Substring(15, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;

            dataFim += Convert.ToInt16(sChave.Substring(17, 2)) / Convert.ToInt16(sChave.Substring(0, 1));;
            dataFim += Convert.ToInt16(sChave.Substring(19, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataFim += Convert.ToInt16(sChave.Substring(21, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataFim += Convert.ToInt16(sChave.Substring(23, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataFim += Convert.ToInt16(sChave.Substring(25, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataFim += Convert.ToInt16(sChave.Substring(27, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataFim += Convert.ToInt16(sChave.Substring(29, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;
            dataFim += Convert.ToInt16(sChave.Substring(31, 2)) / Convert.ToInt16(sChave.Substring(0, 1)); ;

            String Chave = dataInicio + dataFim;

            return Chave;
        
        }

        public bool validarChave(String sChave) {
            if (sChave.Length != 33)
            {
                MessageBox.Show("Chave Inválida", "ERRO", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                return true;
            }

            String sChaveCriptografada = this.chaveCriptografada(sChave);

            String sDataInicio = sChaveCriptografada.Substring(6, 2).ToString() + "/" + sChaveCriptografada.Substring(4, 2).ToString() + "/" + sChaveCriptografada.Substring(0, 4).ToString();
            String sDataFim = sChaveCriptografada.Substring(14, 2).ToString() + "/" + sChaveCriptografada.Substring(12, 2).ToString() + "/" + sChaveCriptografada.Substring(8, 4).ToString();

            DateTime dateInicio = Convert.ToDateTime(sDataInicio);
            DateTime dateFim = Convert.ToDateTime(sDataFim);

            if (Convert.ToDateTime(dateInicio.ToString("dd/MM/yyyy")) > Convert.ToDateTime(dateFim.ToString("dd/MM/yyyy")))
            {
                MessageBox.Show("Chave Inválida", "ERRO", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                return true;
            }

            if (Convert.ToDateTime(dateFim.ToString("dd/MM/yyyy")) < Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")))
            {
                MessageBox.Show("Chave Inválida", "ERRO", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                return true;
            }

            return false;
        }

        public void inserirChave(string sChave) {

            if (validarChave(sChave))
                return;

            string nomeArquivo = "key.txt";
            string arquivoRenomeado = "key.exe";
            string arquivolog = "bin.exe";
            if (File.Exists(arquivoRenomeado) || !File.Exists(arquivoRenomeado))
            {
                File.Delete(arquivoRenomeado);
                File.Delete(arquivolog);
                using (FileStream fs = File.Create(nomeArquivo))
                {
                    using (StreamWriter sw = new StreamWriter(fs))
                    {
                        sw.Write(sChave);
                    }
                }
                File.Move(nomeArquivo, arquivoRenomeado);
            }
            arquivandoChave(recuperarChave());
        }

        public string recuperarChave() {

            string nomeArquivo = "key.txt";
            string arquivoRenomeado = "key.exe";
            if (!File.Exists(arquivoRenomeado))
                return null;

            File.Move(arquivoRenomeado, nomeArquivo);

            FileInfo aFile = new FileInfo(nomeArquivo);
            StreamReader rd = new StreamReader(aFile.FullName);
            string sChave = null;
            while (!rd.EndOfStream)
            {
                sChave = rd.ReadLine();
            }
            rd.Close();

            File.Move(nomeArquivo, arquivoRenomeado);

            sChave = this.chaveCriptografada(sChave);

            return sChave;

        }

        public bool dataAtualEhMenor(DateTime ultimaDataRegistro, DateTime atualData) {
            if (ultimaDataRegistro > Convert.ToDateTime(atualData.ToString("dd/MM/yyyy")))
            {
                setMessage("Data do computador foi modificada, Pois sistema já executou nesta mesma data!");
                return true;
            }
            return false;
        
        }

        public bool verificarNotificacao(DateTime dateInicio, DateTime dateFim) {
            if(Convert.ToDateTime(dateInicio.ToString("dd/MM/yyyy")) > Convert.ToDateTime(dateFim.ToString("dd/MM/yyyy")))
            {
                setMessage("Chave Inválida");
                return true;
            }

            if (Convert.ToDateTime(dateInicio.ToString("dd/MM/yyyy")) > Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")))
            {
                setMessage("Chave válida a partir de " + dateInicio.ToString("dd/MM/yyyy"));
                return true;
            }

            if (Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")) > Convert.ToDateTime(dateFim.ToString("dd/MM/yyyy")))
            {
                setMessage("Senha de Reinstalação em poder da VIN Brasil");
                return true;
            }

            if (Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")) < Convert.ToDateTime(dateInicio.ToString("dd/MM/yyyy")))
            {
                setMessage("Senha de Reinstalação em poder da VIN Brasil");
                return true;
            }

            int diferencaDias = System.Data.Linq.SqlClient.SqlMethods.DateDiffDay(Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")), Convert.ToDateTime(dateFim.ToString("dd/MM/yyyy")));

            if (diferencaDias <= 15) {
                if (diferencaDias < 0) {
                    setMessage("Senha de Reinstalação em poder da VIN Brasil");
                    return true;
                }
                setMessage("Sistema vai expirar em " + diferencaDias + " dia(s)");
                return false;
            }

            return false;
        }

        public bool verificarDia(DateTime ultimaDataRegistro, DateTime atualData)
        {
            if (Convert.ToDateTime(ultimaDataRegistro.ToString("dd/MM/yyyy")) == Convert.ToDateTime(atualData.ToString("dd/MM/yyyy")))    
                return true;

            return false;
        
        }

        public void setMessage(string setMessage) {
            this.message = setMessage;
        }

        public string getMessage() {
            return this.message;
        }
    }
}
